package shayu.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 使用RabbitMq
 * 1. 引入amqp场景：RabbitAutoConfiguration就会生效
 * <p>
 * 2. 给容器中自动配置了
 * RabbitTemplate,AmqAdmin，CachingConnetionFactory,RabbitMessageingTemplate
 * 所有的属性都是spring rabbitmq
 *
 * @ConfigurationProperties(prefix="sping.rabbitmq") public calss RabbitProperties
 * <p>
 * 3. 给配置文件中配置spring rabbimq信息
 * 4. @EnableRabiit:@EnableXXXX :开启功能
 * 5. 监听消息：使用@RabbitListener：@必须有@EnableRaabit
 * @RabbitHandler：标在方法上（重载区分不同的消息）
 *
 * 本地式事务失效问题
 * 同一个对象内事务方法调用默认失效，原因 绕过了 代理对象，事务使用代理对象来控制的
 * 解决：使用代理对象来调用事务方法
 *  1）使用aop-startter。spring-boot-startter-aop引入了aspectj
 *  2）@EnableAspectJAutoProxy(exposeProxy=true) 开启 aspectj 动态代理功能，以后所有的动态代理都是aspect
 *      对外暴露代理对象
 *  3） 本类互相调用对象
 *      OrderServiceImpl orderService=（OrderServiceImpl）AopContext.currentProxy();
 *      orderService.A();
 *      orderService.B()
 *
 */
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableRabbit
@EnableFeignClients
@EnableRedisHttpSession
@EnableDiscoveryClient
@SpringBootApplication
public class ShopOrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShopOrderApplication.class);
    }
}
